package com.gph.saviorframework.wf.service;

import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.repository.ProcessDefinition;

import java.util.List;
import java.util.Map;

/**
 * 流程模板的操作接口
 * @author guopeihui
 */
public interface ActivitiDefService {

    /**
     * 根据流程定义编号获取流程定义实体
     * @param processDefinitionId 流程定义编号
     * @return 流程定义实体
     */
    ProcessDefinitionEntity getProcessDefinitionEntity(String processDefinitionId);

    /**
     * 根据流程key获取最新版本的流程定义
     * @param processDefinitionKey
     * @return
     */
    ProcessDefinition getProcessDefinitionByKey(String processDefinitionKey);

    /**
     * 根据流程定义获取最新版本的流程定义
     * @param processDefinitionId
     * @return
     */
    ProcessDefinition getProcessDefinitionById(String processDefinitionId);

    /**
     * 获取某流程定义中的所有节点
     * @param processDefinitionId 流程定义编号
     * @return 流程定义中所有节点
     */
    List<ActivityImpl> getAllActivities(String processDefinitionId);

    /**
     * 根据流程定义获取流程中所有的任务节点
     * @param processDefinitionId 流程定义编号
     * @return 流程usertask任务节点集合
     */
    List<ActivityImpl> getAllTaskActivity(String processDefinitionId);

    /**
     * 获取所有任务节点
     * @param processDefinitionId
     * @return
     */
    List<Map<String,Object>> getAllUserTaskActivity(String processDefinitionId);

    /**
     * 根据activiti获取usertask的执行人，针对的是流程定义中的
     * @param activity
     * @return
     */
    String getUserTaskAssignee(ActivityImpl activity);

    /**
     * 获取当前节点的直接后继节点
     * @param processDefinitionId 流程定义编号
     * @param activityImpl 当前节点
     * @param activityId 当前节点编号
     * @param containsEndNode 是否要包含结束节点
     * @return 直接后继节点集合
     */
    List<ActivityImpl> getNextNodes(String processDefinitionId,ActivityImpl activityImpl,String activityId,
                                    boolean containsEndNode);

    /**
     * 获取当前节点的直接后继节点
     * @param processDefinitionId 流程定义编号
     * @param activityImpl 当前节点
     * @param activityId 当前节点编号
     * @param containsEndNode 是否要包含结束节点
     * @param excludeNodes 排除的节点
     * @return 直接后继节点集合
     */
    List<ActivityImpl> getNextNodes(String processDefinitionId,ActivityImpl activityImpl,String activityId,
                                    boolean containsEndNode,List<String> excludeNodes);

    /**
     * 获取某个节点的全部后继节点
     * @param processDefinitionId 流程定义编号
     * @param activityImpl 当前节点
     * @param activityId 当前节点编号
     * @param containsEndNode 是否要包含结束节点
     * @return
     */
    List<ActivityImpl> getNextAllNodes(String processDefinitionId,ActivityImpl activityImpl,String activityId,
                                    boolean containsEndNode);

    /**
     * 获取某个节点的全部后继节点
     * @param processDefinitionId 流程定义编号
     * @param activityImpl 当前节点
     * @param activityId 当前节点编号
     * @param containsEndNode 是否要包含结束节点
     * @param excludeNodes 排除的节点
     * @return
     */
    List<ActivityImpl> getNextAllNodes(String processDefinitionId,ActivityImpl activityImpl,String activityId,
                                       boolean containsEndNode,List<String> excludeNodes);

    /**
     * 获取当前节点的直接后继节点
     * @param processDefinitionId 流程定义编号
     * @param activityImpl 当前节点
     * @param activityId 当前节点编号
     * @param containsEndNode 是否要包含结束节点
     * @return 直接后继节点集合
     */
    List<ActivityImpl> getNextNodes(String processDefinitionId,ActivityImpl activityImpl,
                                    String activityId,String elString,boolean containsEndNode);
    
    /**
     * 获取当前节点的直接后继节点
     * @param processDefinitionId 流程定义编号
     * @param activityImpl 当前节点
     * @param activityId 当前节点编号
     * @param containsEndNode 是否要包含结束节点
     * @param excludeNodes 要排除的节点
     * @return 直接后继节点集合
     */
    List<ActivityImpl> getNextNodes(String processDefinitionId,ActivityImpl activityImpl,
            String activityId,String elString,boolean containsEndNode,List<String> excludeNodes);


    /**
     * 根据节点编号获取ActivityImpl
     * @param processDefinitionId 流程定义编号
     * @param currentActivityId 当前节点编号
     * @return ActivityImpl
     */
    ActivityImpl findActivity(String processDefinitionId,String currentActivityId);

    /**
     * 获取当前结点的直接前驱结点
     * @param processDefinitionId 流程定义编号
     * @param currentActivityId 当前节点编号
     * @return
     */
    List<ActivityImpl> getPresNodes(String processDefinitionId,String currentActivityId);

    /**
     * 递归获取当前结点的前驱结点
     * @param processDefinitionId 流程定义编号
     * @param currentActivityId 当前节点编号
     * @return
     */
    List<ActivityImpl> getAllPreNodes(String processDefinitionId,String currentActivityId);

    /**
     * 获取一个任务节点
     * @param activityImpl 当前任务节点
     * @param activityId 当前任务编号
     * @param elString el表达式
     * @return
     */
    TaskDefinition getNextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString);

    /**
     * 获取某个结点的下一个任务结点的集合
     * @param activityImpl
     * @param activityId
     * @return
     */
    List<TaskDefinition> getNextTaskDefinitions(ActivityImpl activityImpl, String activityId);

    /**
     * 流程定义图预览
     * @param processDefinitionId
     * @return
     */
    byte[] viewProcessDefinitionDiagram(String processDefinitionId) throws Exception;

    /**
     * 流程定义预览
     * @param resourceType
     * @param processDefinitionId
     * @return
     * @throws Exception
     */
    byte[] viewProcessDefinitionDiagram(String resourceType,String processDefinitionId) throws Exception;

    /**
     * 获取所有的流程定义实例
     * @param start
     * @param limit
     * @param sort
     * @param dir
     * @return
     */
    Map<String,Object> findAllProcessDefinitionMap(Integer start, Integer limit, String sort, String dir);

    /**
     * 分页查找已经发布的流程定义
     * @param start
     * @param limit
     * @param sort
     * @param dir
     * @return
     */
    List<ProcessDefinition> findAllProcessDefinition(Integer start, Integer limit,String sort, String dir);

    /**
     * 计算所有的流程定义实例
     * @return
     */
    long countAllProcessDefinition();

    /**
     * 导入流程定义
     * @param fileName
     * @param bs
     */
    void importProcessDefinition(String fileName, byte[] bs);

    /**
     * 删除流程定义
     * @param definition
     */
    void deleteProcessDefinition(ProcessDefinition definition);

    /**
     * 根据部署id删除流程定义
     * @param deploymentId
     */
    void deleteProcessDefinition(String deploymentId);
}
